/*
STL 函数对象
重载函数调用操作符的类，其对象常称作函数对象，也叫仿函数
函数对象(仿函数)本质是一个类，不是函数。

函数对象在使用时可以像普通函数那样调用，可以有参数，可以有返回值
函数对象可以有自己的状态
函数对象可以作为参数传递

返回bool类型的仿函数称为谓词
如果operator() 接受一个参数叫一元谓词 两个参数叫二元谓
*/

#include <iostream>
#include <string>
using namespace std;

class MyPrintStr
{
public:
    int count = 0;
    void operator()(const string &s)
    {
        cout << s << endl;
        count++;
    }
};

void test(MyPrintStr& mps, const string& s)
{
    cout << "this is test func.." << endl;
    mps(s);
}

int main()
{
    MyPrintStr mps;
    mps("hi c++");  // 像函数一样调用

    cout << "call times: " << mps.count << endl;  // 自己的状态

    test(mps, "wa ha ha...");  // 作为参数传递

    return 0;
}